3903
4254
Nylig kjørte jeg noe av JavaScript-koden min gjennom Crockfords JSLint, og den ga følgende feil:
Problem ved linje 1 tegn 1: Mangler "bruk streng" uttalelse.
Gjorde litt leting, innså jeg at noen mennesker legger til "bruk streng"; inn i JavaScript-koden. Når jeg la til uttalelsen, sluttet feilen å vises. Dessverre avslørte Google ikke mye av historikken bak denne streng uttalelsen. Det må absolutt ha noe å gjøre med hvordan JavaScript tolkes av nettleseren, men jeg aner ikke hva effekten ville være.
Så hva er "bruk streng"; alt om, hva innebærer det, og er det fortsatt relevant?
Svarer noen av de nåværende nettleserne på "bruk streng"; streng eller er det for fremtidig bruk? 
Denne artikkelen om Javascript Strict Mode kan interessere deg: John Resig - ECMAScript 5 Strict Mode, JSON og mer
For å sitere noen interessante deler:
Strikt modus er en ny funksjon i ECMAScript 5 som lar deg plassere et program, eller en funksjon, i en "streng" driftssammenheng. Denne strenge konteksten forhindrer at visse handlinger blir tatt, og gir flere unntak.
Og:
Streng modus hjelper på noen måter:
Det fanger noen vanlige kodende bloopere, med unntak.
Det forhindrer eller kaster feil når relativt "usikre" handlinger blir tatt (for eksempel å få tilgang til det globale objektet).
Det deaktiverer funksjoner som er forvirrende eller lite gjennomtenkte.
Vær også oppmerksom på at du kan bruke "streng modus" på hele filen ... Eller du kan bare bruke den til en bestemt funksjon (siterer fremdeles fra John Resigs artikkel):
// Ikke-streng kode ...
(funksjon(){
"bruk streng";
// Definer biblioteket ditt strengt ...
}) ();
// Ikke-streng kode ...
Noe som kan være nyttig hvis du må blande gammel og ny kode ;-)
Så jeg antar at det er litt som "bruk streng" du kan bruke i Perl (derav navnet?): Det hjelper deg med å gjøre færre feil ved å oppdage flere ting som kan føre til brudd.
Strengt modus støttes nå av alle store nettlesere.
Inne i innfødte ECMAScript-moduler (med import- og eksportuttalelser) og ES6-klasser, er streng modus alltid aktivert og kan ikke deaktiveres.
|
Det er en ny funksjon i ECMAScript 5. John Resig skrev opp en fin oppsummering av den.
Det er bare en streng du legger i JavaScript-filene dine (enten øverst i filen eller inne i en funksjon) som ser slik ut:
"bruk streng";
Å legge den i koden din nå, burde ikke forårsake problemer med nåværende nettlesere, da det bare er en streng. Det kan føre til problemer med koden din i fremtiden hvis koden din bryter med pragmaet. For eksempel, hvis du for øyeblikket har foo = "bar" uten å definere foo først, vil koden din mislykkes ... noe som er en god ting etter min mening.
|
Uttalelsen "bruk streng"; instruerer nettleseren om å bruke Streng-modus, som er et redusert og sikrere funksjonssett med JavaScript.
Liste over funksjoner (ikke uttømmende)
Tillater ikke globale variabler. (Fanger manglende varedeklarasjoner og skrivefeil i variabelnavn)
Stille mislykkede oppgaver vil kaste feil i streng modus (tildele NaN = 5;)
Forsøk på å slette ikke-slettbare egenskaper vil kaste (slett Object.prototype)
Krever at alle eiendomsnavn i et objekt bokstavelig talt er unike (var x = {x1: "1", x1: "2"})
Funksjonsparameternavn må være unike (funksjonssum (x, x) {...})
Forbyder oktal syntaks (var x = 023; noen devs antar feilaktig at et foregående null ikke gjør noe for å endre tallet.)
Forbyder nøkkelordet
eval i streng modus introduserer ikke nye variabler
Forbyder å slette vanlige navn (slett x;)
Forbyder binding eller tildeling av navnevaluer og argumenter i alle former
Streng modus alias ikke egenskapene til argumentene med de formelle parametrene. (dvs. i funksjonssummen (a, b) {returargumenter [0] + b;} Dette fungerer fordi argumenter [0] er bundet til a og så videre.)
arguments.callee støttes ikke
[Ref: Strengt modus, Mozilla Developer Network]
|
Hvis folk er bekymret for å bruke streng bruk, kan det være verdt å sjekke ut denne artikkelen:
ECMAScript 5 'Streng modus' støtte i nettlesere. Hva betyr dette? NovoGeek.com - Krishnas weblog
Det snakker om nettleserstøtte, men enda viktigere hvordan du håndterer det trygt:
funksjonen isStrictMode () {
returner! dette;
}
/ *
returnerer falsk, siden 'dette' refererer til globalt objekt og
'! dette' blir falskt
* /
funksjonen isStrictMode () {
"bruk streng";
returner! dette;
}
/ *
returnerer sant, siden i streng modus nøkkelordet 'dette'
refererer ikke til globalt objekt, i motsetning til tradisjonell JS.
Så her, 'dette' er 'udefinert' og '! Dette' blir sant.
* /
|
Et ord med forsiktighet, alle hardt ladende programmerere: å bruke "bruk streng" på eksisterende kode kan være farlig! Denne tingen er ikke et følelses-godt, lykkelig ansikts-klistremerke som du kan slå på koden for å gjøre den 'bedre'. Med "bruk streng" pragma, vil nettleseren plutselig kaste unntak på tilfeldige steder som den aldri kastet før bare fordi du på det stedet gjør noe som standard / løs JavaScript lykkelig tillater, men strenge JavaScript avskyr! Du kan ha strenge brudd som gjemmer seg i sjelden brukte samtaler i koden din, som bare vil gi et unntak når de til slutt kjøres - si i produksjonsmiljøet som betalende kunder bruker!
Hvis du skal ta steget, er det en god ide å bruke "bruk streng" sammen med omfattende enhetstester og en strengt konfigurert JSHint-oppgave som vil gi deg litt tillit til at det ikke er noe mørkt hjørne av modulen din som vil sprenge fryktelig bare fordi du har slått på Strengt modus. Eller hei, her er et annet alternativ: bare ikke legg til "bruk streng" til noen av dine eldre koder, det er sannsynligvis tryggere på den måten, ærlig talt. DEFINITIVT IKKE legg til "bruk streng" til moduler du ikke eier ellervedlikeholde, som tredjepartsmoduler.
Jeg tror selv om det er et dødelig burdyr, kan "bruk streng" være gode ting, men du må gjøre det riktig. Den beste tiden å være streng er når prosjektet ditt er greenfield og du begynner fra bunnen av. Konfigurer JSHint / JSLint med alle advarslene og alternativene skrudd opp så tett som teamet ditt kan mage, få et godt bygg / test / hevd system du jour rigget som Grunt + Karma + Chai, og bare begynn deretter å merke alle dine nye moduler som " bruk streng ". Vær forberedt på å kurere mange niggly feil og advarsler. Forsikre deg om at alle forstår tyngdekraften ved å konfigurere build til FAIL hvis JSHint / JSLint produserer brudd.
Prosjektet mitt var ikke et greenfield-prosjekt da jeg vedtok "bruk streng". Som et resultat er IDE-en min full av røde merker fordi jeg ikke har "bruk streng" på halve modulene mine, og JSHint klager over det. Det er en påminnelse til meg om hvilken refactoring jeg bør gjøre i fremtiden. Målet mitt er å være rød merkefri på grunn av alle mine manglende "bruk strenge" uttalelser, men det er år unna nå.
|
Bruk 'bruk streng'; gjør ikke plutselig koden din bedre.
JavaScript-streng modus er en funksjon i ECMAScript 5. Du kan aktivere streng modus ved å erklære dette øverst i skriptet / funksjonen.
'bruk streng';
Når en JavaScript-motor ser dette direktivet, begynner den å tolke koden i en spesiell modus. I denne modusen blir feil kastet når visse kodingsmetoder som kan ende opp med å bli potensielle feil blir oppdaget (som er begrunnelsen bak den strenge modusen).
Tenk på dette eksemplet:
var a = 365;
var b = 030;
I sin besettelse for å stille opp de numeriske bokstavene, har utvikleren utilsiktet initialisert variabel b med en oktal bokstavelig. Ikke-streng modus vil tolke dette som en numerisk bokstav med verdi 24 (i base 10). Imidlertid vil streng modus kaste en feil.
For en ikke-uttømmende liste over spesialiteter i streng modus, se dette svaret.
Hvor skal jeg bruke "bruk streng" ;?
I min nye JavaScript-applikasjon: Absolutt! Streng modus kan brukes som varsler når du gjør noe dumt med koden din.
I min eksisterende JavaScript-kode: Sannsynligvis ikke! Hvis din eksisterende JavaScript-kode har utsagn som er forbudt i streng modus, vil applikasjonen bare gå i stykker. Hvis du vil ha streng modus, bør du være forberedt på å feilsøke og korrigere den eksisterende koden. Dette er grunnen til at bruk 'bruk streng'; gjør ikke plutselig koden din bedre.
Hvordan bruker jeg streng modus?
Sett inn en 'bruk streng'; uttalelse på toppen av skriptet ditt:
// Fil: myscript.js
'bruk streng';
var a = 2;
....
Merk at alt i filen myscript.js tolkes i streng modus.
Eller sett inn en 'bruk streng'; uttalelse på toppen av din funksjonsdel:
funksjon doSomething () {
'bruk streng';
...
}
Alt i det leksikale funksjonsomfanget DoNething vil bli tolket i streng modus. Ordet leksikalt omfang er viktig her. For eksempel, hvis den strenge koden din kaller en funksjon i et bibliotek som ikke er streng, blir bare koden din utført i streng modus, og ikke den ringte funksjonen. Se dette svaret for en bedre forklaring.
Hvilke ting er forbudt i streng modus?
Jeg fant en fin artikkel som beskriver flere ting som er forbudt i streng modus (merk at dette ikke er en eksklusiv liste):
omfang
Historisk har JavaScript vært forvirret om hvordan funksjoner fungerer
er omfanget. Noen ganger ser de ut til å være statisk, men noen
funksjoner får dem til å oppføre seg som de er dynamisk. Dette er
forvirrende, noe som gjør programmer vanskelig å lese og forstå.
Misforståelse forårsaker feil. Det er også et problem for ytelse.
Statisk scoping vil tillate at variabel binding skjer ved kompilering
tid, men kravet til dynamisk omfang betyr at bindingen må være
utsatt til kjøretid, som kommer med en betydelig ytelse
straff.
Streng modus krever at all variabel binding gjøres statisk.
Det betyr at funksjonene som tidligere krevde dynamisk binding
må elimineres eller modifiseres. Spesielt er med uttalelsen
eliminert, og eval funksjonens evne til å tukle med
miljøet til den som ringer er sterkt begrenset.
En av fordelene med streng kode er at verktøy som YUI Compressor
kan gjøre en bedre jobb når du behandler den.
Underforståtte globale variabler
JavaScript har antydet globale variabler. Hvis
du ikke eksplisitt erklærer en variabel, en global variabel er
implisitt erklært for deg. Dette gjør programmering enklere for
nybegynnere fordi de kan forsømme noe av deres grunnleggende rengjøring
gjøremål. Men det gjør styringen av større programmer mye mer
vanskelig og forringer påliteligheten betydelig. Så i strengt
modus, blir ikke lenger implisitte globale variabler opprettet. Du burde
erklærer eksplisitt alle variablene dine.
Global lekkasje
Det er en rekke situasjoner som kan forårsake dette
å være bundet til det globale objektet. For eksempel hvis du glemmer å
oppgi det nye prefikset når du ringer til en konstruktørfunksjon,
konstruktørens dette vil være uventet bundet til det globale objektet, så
i stedet for å initialisere et nytt objekt, vil det i stedet være stille
tukling med globale variabler. I disse situasjonene vil streng modus
i stedet binde dette til udefinert, noe som vil føre til at konstruktøren gjør det
kaste et unntak i stedet, slik at feilen kan oppdages mye
før.
Støyende feil
JavaScript har alltid hatt skrivebeskyttede egenskaper, men du
kunne ikke lage dem selv før ES5s Object.createProperty
funksjon utsatt for den muligheten. Hvis du prøvde å tilordne en verdi
til en skrivebeskyttet eiendom, ville den mislykkes stille. Oppdraget ville
ikke endre eiendommens verdi, men programmet vil fortsette som
selv om det hadde. Dette er en integritetsfare som kan føre til at programmer gjør det
gå inn i en inkonsekvent tilstand. I streng modus prøver du å endre en
skrivebeskyttet eiendom har et unntak.
Octal
Den oktale (eller base 8) representasjonen av tall var ekstremt
nyttig når du gjør programmering på maskinnivå på maskiner med ord
størrelser var et multiplum av 3. Du trengte oktal når du jobbet med CDC
6600 mainframe, som hadde en ordstørrelse på 60 bits. Hvis du kunne lese
oktalt, kan du se på et ord som 20 sifre. To sifre representert
op-koden, og ett siffer identifiserte ett av åtte registre. I løpet av
langsom overgang fra maskinkoder til språk på høyt nivå, var det
tenkt å være nyttig for å gi oktale former i programmeringsspråk.
I C var en ekstremt uheldig fremstilling av oktalitet
valgt: Ledende null. Så i C betyr 0100 64, ikke 100, og 08 er et
feil, ikke 8. Enda mer dessverre har denne anakronismen vært
kopiert til nesten alle moderne språk, inkludert JavaScript, hvor
den brukes bare til å lage feil. Det har ingen andre formål. Så inn
streng modus er ikke oktale former lenger tillatt.
Og så videre
Argumentene pseudo array blir litt mer
array-lignende i ES5. I streng modus mister den callee og innringer
eiendommer. Dette gjør det mulig å overføre argumentene dine til utro
kode uten å gi opp mye konfidensiell kontekst. Også, den
argumenter egenskap av funksjoner er eliminert.
I streng modus vil dupliserte nøkler i en funksjon bokstavelig produsere en
syntaksfeil. En funksjon kan ikke ha to parametere med samme navn.
En funksjon kan ikke ha en variabel med samme navn som en av dens
parametere. En funksjon kan ikke slette sine egne variabler. Et forsøk på
slett en ikke-konfigurerbar eiendom kaster nå et unntak. Primitiv
verdier er ikke implisitt pakket inn.
Reserverte ord for fremtidige JavaScript-versjoner
ECMAScript 5 legger til en liste med reserverte ord. Hvis du bruker dem som variabler eller argumenter, vil streng modus kaste en feil. De reserverte ordene er:
implementerer, grensesnitt, la, pakke, privat, beskyttet, offentlig, statisk og avkastning
Videre lesning
Streng modus - JavaScript | MDN
Nettleserstøtte for streng modus
Overgang til streng modus
|
Jeg anbefaler alle utviklere på det sterkeste å begynne å bruke streng modus nå. Det er nok nettlesere som støtter det til at streng modus legitimt vil hjelpe oss med å redde oss fra feil vi ikke engang visste var i koden din.
Tilsynelatende vil det i begynnelsen være feil vi aldri har opplevd før. For å få full nytte, må vi gjøre riktig testing etter å ha byttet til streng modus for å sikre at vi har fått med alt. Definitivt kaster vi ikke bare bruk streng i koden vår og antar at det ikke er noen feil. Så churn er at det er på tide å begynne å bruke denne utrolig nyttige språkfunksjonen for å skrive bedre kode.
For eksempel,
var person = {
navn: 'xyz',
posisjon: 'abc',
fullname: function () {"bruk streng"; returner dette.navn; }
};
JSLint er en feilsøking skrevet av Douglas Crockford. Bare lim inn skriptet ditt, så skanner det raskt etter merkbare problemer og feil i koden din.
|
Jeg vil gjerne tilby et noe mer fundert svar som supplerer de andre svarene. Jeg håpet å redigere det mest populære svaret, men mislyktes. Jeg prøvde å gjøre den så omfattende og fullstendig som jeg kunne.
Du kan se i MDN-dokumentasjonen for mer informasjon.
"bruk streng" et direktiv introdusert i ECMAScript 5.
Direktivene ligner påstander, men likevel forskjellige.
bruk streng inneholder ikke stikkord: Direktivet er et enkelt uttrykk, som består av en spesiell streng bokstavelig (i enkle eller doble anførselstegn). JavaScript-motorer, som ikke implementerer ECMAScript 5, ser bare et uttrykksuttalelse uten bivirkninger. Det forventes at fremtidige versjoner av ECMAScript-standarder introduserer bruk som et reelt stikkord; sitatene ville dermed bli foreldet.
bruk streng kan bare brukes i begynnelsen av et skript eller en funksjon, dvs. det må gå foran hver annen (ekte) uttalelse. Det trenger ikke være den første instruksjonen i et funksjonsskript: den kan innledes med andre setningsuttrykk som består av strenglitteraler (og JavaScriptimplementeringer kan behandle dem som implementeringsspesifikke direktiver). String bokstavelige uttalelser, som følger en første virkelige uttalelse (i et skript eller en funksjon) er enkle uttrykk uttalelser. Tolker må ikke tolke dem som direktiver, og de har ingen effekt.
Brukets strenge direktiv indikerer at følgende kode (i et skript eller en funksjon) er streng kode.
Koden på det høyeste nivået av et skript (kode som ikke er i en funksjon) regnes som streng kode når skriptet inneholder et brukstrikt direktiv.
Innholdet i en funksjon regnes som streng kode når selve funksjonen er definert i en streng kode eller når funksjonen inneholder et strengt bruksdirektiv.
Kode som sendes til en eval () -metode regnes som streng kode når eval () ble kalt fra en streng kode eller inneholder selve bruksstrengdirektivet.
Den strenge modusen til ECMAScript 5 er en begrenset delmengde av JavaScript-språket, som eliminerer relevante underskudd på språket og har strengere feilkontroll og høyere sikkerhet. Følgende viser forskjellene mellom streng modus og normal modus (hvorav de tre første er spesielt viktige):
Du kan ikke bruke with-statement i streng modus.
I streng modus må alle variabler deklareres: Hvis du tilordner en verdi til en identifikator som ikke er deklarert som variabel, funksjon, funksjonsparameter, fangst-parameter eller egenskap for det globale objektet, får du en ReferenceError. I normal modus blir identifikatoren implisitt erklært som en global variabel (som en egenskap for det globale objektet)
I streng modus har nøkkelordet denne verdien udefinert i funksjoner som ble påkalt som funksjoner (ikke som metoder). (I normal modus peker dette alltid mot det globale objektet). Denne forskjellen kan brukes til å teste om en implementering støtter streng modus:
var hasStrictMode = (funksjon () {"bruk streng"; returner denne === udefinert} ());
Også når en funksjon påkalles med call () eller gjelder i streng modus, så er dette nøyaktig verdien av det første argumentet for call () eller Apply () påkallelse. (I normal modus erstattes null og udefinert av det globale objektet og verdier, som ikke er objekter, blir kastet inn i objekter.)
I streng modus får du en TypeError når du prøver å tilordne til skrivebeskyttede egenskaper eller å definere nye egenskaper for et ikke-utvidbart objekt. (I normal modus mislykkes begge rett og slett uten feilmelding.)
I streng modus, når du overfører kode til eval (), kan du ikke erklære eller definere variabler eller funksjoner i ringerens omfang (slik du kan gjøre det i normal modus). I stedet opprettes et nytt omfang for eval (), og variablene og funksjonene er innenfor dette omfanget. Dette omfanget blir ødelagt etter at eval () er ferdig med henrettelsen.
I streng modus inneholder argumentobjektet til en funksjon en statisk kopi av verdiene som sendes til den funksjonen. I normal modus har argumentobjektet en noe "magisk" oppførsel: Elementene i matrisen og de nevnte funksjonsparametrene refererer til begge de samme verdien.
I streng modus får du en syntaksfeil når sletteoperatøren blir fulgt av en ikke-kvalifisert identifikator (en variabel, funksjon eller funksjonsparameter). I normal modus vil sletteuttrykket ikke gjøre noe og blir evaluert til falskt.
I streng modus får du en TypeError når du prøver å slette en ikke-konfigurerbar eiendom. (I normal modus mislykkes forsøket, og sletteuttrykket blir evaluert til falskt).
I streng modus blir det ansett som en syntaktisk feil når du prøver å definere flere egenskaper med samme navn for et objekt bokstavelig. (I normal modus er det ingen feil.)
I streng modus regnes det som en syntaktisk feil når en funksjonserklæring har flere parametere med samme navn. (I normal modus er det ingen feil.)
I streng modus er ikke oktale bokstaver tillatt (dette er bokstaver som starter med 0x. (I normal modus tillater noen implementeringer oktale bokstaver.)
I streng modus behandles identifikatorene og argumentene som nøkkelord. Du kan ikke endre verdien, kan ikke tildele en verdi til dem, og du kan ikke bruke dem som navn på variabler, funksjoner, funksjonsparametere eller identifikatorer for en fangstblokk.
I streng modus er det flere begrensninger for mulighetene til å undersøke samtalestakken. argumenter.kaller og argumenter.kalle forårsaker en TypeError i en funksjon i streng modus. Videre forårsaker noen innringer- og argumentegenskaper til funksjoner i streng modus en TypeError når du prøver å lese dem.
|
Mine to øre:
Et av målene med streng modus er å tillate raskere feilsøking av problemer. Det hjelper utviklerne ved å kaste unntak når visse gale ting oppstår som kan forårsake stille og merkelig oppførsel på websiden din. I det øyeblikket vi bruker streng, vil koden kaste ut feil som hjelper utvikleren med å fikse det på forhånd.
Få viktige ting som jeg har lært etter bruk av strenge:
Hindrer global variabel erklæring:
var tree1Data= {navn: 'Banantre', alder: 100, leafCount: 100000};
funksjonstreet (typeOfTree) {
var alder;
var leafCount;
alder = typeOfTree.age;
leafCount = typeOfTree.leafCount;
nameoftree = typeOfTree.name;
};
var tree1 = nytt tre (tree1Data);
console.log (vindu);
Nå skaper denne koden navnefree i globalt omfang som kan nås ved hjelp av window.nameoftree. Når vi implementerer bruk streng, vil koden kaste feil.
Ikke fanget referansefeil: nameoftree er ikke definert
Prøve
Elimineres med utsagn:
med utsagn kan ikke minifiseres ved hjelp av verktøy som uglify-js. De blir også utfaset og fjernet fra fremtidige JavaScript-versjoner.
Prøve
Forhindrer duplikater:
Når vi har duplikategenskap, kaster det et unntak
Ikke fanget syntaksfeil: Dupliser dataegenskap i objekt bokstavelig ikke
tillatt i streng modus
"bruk streng";
var tree1Data = {
navn: 'Banan Tree',
alder: 100,
leafCount: 100000,
navn: 'Banan Tree'
};
Det er få flere, men jeg trenger å få mer kunnskap om det.
|
Hvis du bruker en nettleser som ble utgitt det siste året eller så, støtter den mest sannsynlig JavaScript Strict-modus. Bare eldre nettlesere rundt før ECMAScript 5 ble gjeldende standard, støtter ikke det.
Sitatene rundt kommandoen sørger for at koden fortsatt vil fungere i eldre nettlesere også (selv om tingene som genererer en syntaksfeil i streng modus, vanligvis bare vil føre til at skriptet fungerer som det skal på en vanskelig måte å oppdage i de eldre nettleserne).
|
Når du legger til "bruk streng"; vil følgende tilfeller kaste en syntaksfeil før skriptet kjøres:
Bane vei for fremtidige ECMAScript-versjoner, ved hjelp av et av de nylig reservert nøkkelordene (tidligere for ECMAScript 6): implementerer, grensesnitt, let, pakke, privat, beskyttet, offentlig, statisk og avkastning.
Deklarerende funksjon i blokker
hvis (a : 3: 15)
på : 6: 5
Her kaster kompilatoren referansefeil. I streng modus tillater ikke kompilatoren oss å bruke variabelen uten å erklære den. Så minnelekkasjer kan forhindres. I tillegg kan vi skrive mer optimalisert kode.
|
Streng modus eliminerer feil som vil bli ignorert i ikke-streng modus, og gjør javascript "sikrere".
Betraktes det blant beste praksis?
Ja, det regnes som en del av de beste metodene mens du arbeider med javascript for å inkludere Streng-modus. Dette gjøres ved å legge til nedenstående kodelinje i JS-filen.
'bruk streng';
i koden din.
Hva betyr det for brukeragenter?
Å indikere at koden skal tolkes i streng modus, spesifiserer for brukeragenter som nettlesere at de skal behandle kode bokstavelig som skrevet, og kaste en feil hvis koden ikke gir mening.
For eksempel: Tenk på .js-filen din at du har følgende kode:
Scenario 1: [INGEN STRENG MODUS]
var city = "Chicago"
console.log (city) // Skriver ut bynavnet, dvs. Chicago
Scenario 2: [INGEN STRENG MODUS]
city ​​= "Chicago"
console.log (city) // Skriver ut bynavnet, dvs. Chicago
Så hvorfor blir variabelnavnet skrevet ut i begge tilfeller?
Uten streng modus slått på, bruker brukeragenter ofte gjennom en rekke modifikasjoner av problematisk kode i et forsøk på å få det til å være fornuftig. På overflaten kan dette virke som en fin ting, og det å jobbe utenfor streng modus gjør det mulig for folk å bli våte med JavaScript-kode uten å ha alle detaljene ganske spikret. Som utvikler vil jeg imidlertid ikke legge igjen en feil i koden, fordi jeg vet at den kan komme tilbake og bite meg senere, og jeg vil også bare skrive god kode. Og det er der streng modus hjelper.
Scenario 3: [STRENG MODUS]
'bruk streng';
city ​​= "Chicago"
console.log (by) // Referansefeil: oppgave er ikke angitt variabel by.
Tilleggstips: For å opprettholde kodekvaliteten i streng modus, trenger du ikke å skrive dette om og om igjen, spesielt hvis du har flere .js-filer. Du kan håndheve denne regelen globalt i eslint-regler som følger:
Filnavn: .eslintrc.js
module.exports = {
env: {
es6: sant
},
regler: {
streng: ['error', 'global'],
},
};
Ok, så hva forhindres i streng modus?
Hvis du bruker en variabel uten å erklære, vil den kaste en feil i streng modus. Dette er for å forhindre utilsiktet oppretting av globale variabler i hele applikasjonen. Eksemplet med utskrift av Chicago dekker spesielt dette.
Slette en variabel eller en funksjon eller et argument er et nei-nei i streng modus.
"bruk streng";
funksjon x (p1, p2) {};
slett x; // Dette vil føre til en feil
Duplisering av et parameternavn er ikke tillatt i streng modus.
"bruk streng";
funksjon x (p1, p1) {}; // Dette vil føre til en feil
Reserverte ord på Javascript-språket er ikke tillatt i streng modus. Ordene er implementeringsgrensesnitt, la, pakker, privat, beskyttet, offentlig. statisk, og utbytte
For en mer omfattende liste, sjekk ut MDN-dokumentasjonen her: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode
|
Svært aktivt spørsmål. Tjen 10 rykte for å svare på dette spørsmålet. Omdømmekravet hjelper deg med å beskytte dette spørsmålet mot spam og ikke-svar-aktivitet.
Er ikke svaret du leter etter? Bla gjennom andre spørsmål merket javascript syntaks jslint bruk-streng eller still ditt eget spørsmål.